package com.itextpdf.text.pdf.table;
import com.itextpdf.testutils.CompareTool;
import com.itextpdf.testutils.TestResourceUtils;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @author Raf Hens
*/
public class KeepTogetherTest {
private String cmpFolder = "./src/test/resources/com/itextpdf/text/pdf/table/keeptogether/";;
private String outFolder = "./target/com/itextpdf/text/pdf/table/keeptogether/";
@Before
public void setUp() throws Exception {
new File(outFolder).mkdirs();
TestResourceUtils.purgeTempFiles();
}
@Test
public void testKeepTogether1() throws DocumentException, IOException, InterruptedException {
testKeepTogether(true, true);
compareDocuments(true, true);
}
@Test
public void testKeepTogether2() throws DocumentException, IOException, InterruptedException {
testKeepTogether(true, false);
compareDocuments(true, false);
}
@Test
public void testKeepTogether3() throws DocumentException, IOException, InterruptedException {
testKeepTogether(false, true);
compareDocuments(false, true);
}
@Test
public void testKeepTogether4() throws DocumentException, IOException, InterruptedException {
testKeepTogether(false, false);
compareDocuments(false, false);
}
@Test
public void testSplitLateAndSplitRow1() throws IOException, DocumentException, InterruptedException {
String filename = "testSplitLateAndSplitRow1.pdf";
Document doc = new Document(PageSize.LETTER, 72f, 72f, 72f, 72f);
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(outFolder + filename));
doc.open();
PdfContentByte canvas = writer.getDirectContent();
ColumnText ct = new ColumnText(canvas);
StringBuilder text = new StringBuilder();
for (int i = 0; i < 21; ++i) {
text.append(i).append("\n");
}
// Add a table with a single row and column that doesn't fit on one page
PdfPTable t = new PdfPTable(1);
t.setSplitLate(true);
t.setSplitRows(true);
t.setWidthPercentage(100f);
ct.addElement(new Paragraph("Pushing table down\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\n"));
PdfPCell c = new PdfPCell();
c.setHorizontalAlignment(Element.ALIGN_LEFT);
c.setVerticalAlignment(Element.ALIGN_TOP);
c.setBorder(Rectangle.NO_BORDER);
c.setBorderWidth(0);
c.setPadding(0);
c.addElement(new Paragraph(text.toString()));
t.addCell(c);
ct.addElement(t);
int status = 0;
while (ColumnText.hasMoreText(status)) {
ct.setSimpleColumn(doc.left(), doc.bottom(), doc.right(), doc.top());
status = ct.go();
if (ColumnText.hasMoreText(status))
doc.newPage();
}
doc.close();
String errorMessage = new CompareTool().compareByContent(outFolder + filename, cmpFolder + filename, outFolder, "diff");
if (errorMessage != null) {
Assert.fail(errorMessage);
}
}
@Test
public void testSplitLateAndSplitRow2() throws IOException, DocumentException, InterruptedException {
String filename = "testSplitLateAndSplitRow2.pdf";
Document doc = new Document(PageSize.LETTER, 72f, 72f, 72f, 72f);
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(outFolder + filename));
doc.open();
PdfContentByte canvas = writer.getDirectContent();
ColumnText ct = new ColumnText(canvas);
StringBuilder text = new StringBuilder();
for (int i = 0; i < 42; ++i) {
text.append(i).append("\n");
}
// Add a table with a single row and column that doesn't fit on one page
PdfPTable t = new PdfPTable(1);
t.setSplitLate(true);
t.setSplitRows(true);
t.setWidthPercentage(100f);
ct.addElement(new Paragraph("Pushing table down\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\ndown\n"));
PdfPCell c = new PdfPCell();
c.setHorizontalAlignment(Element.ALIGN_LEFT);
c.setVerticalAlignment(Element.ALIGN_TOP);
c.setBorder(Rectangle.NO_BORDER);
c.setBorderWidth(0);
c.setPadding(0);
c.addElement(new Paragraph(text.toString()));
t.addCell(c);
ct.addElement(t);
int status = 0;
while (ColumnText.hasMoreText(status)) {
ct.setSimpleColumn(doc.left(), doc.bottom(), doc.right(), doc.top());
status = ct.go();
if (ColumnText.hasMoreText(status))
doc.newPage();
}
doc.close();
String errorMessage = new CompareTool().compareByContent(outFolder + filename, cmpFolder + filename, outFolder, "diff");
if (errorMessage != null) {
Assert.fail(errorMessage);
}
}
public void testKeepTogether(final boolean tagged,
final boolean keepTogether) throws FileNotFoundException, DocumentException {
Document document = new Document();
String file = "tagged_"+tagged+"-keeptogether_"+keepTogether+".pdf";
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(outFolder + file));
if (tagged)
writer.setTagged();
document.open();
int columns = 3;
int tables = 3;
for (int tableCount = 0; tableCount < tables; tableCount++) {
PdfPTable table = new PdfPTable(columns);
for (int rowCount = 0; rowCount < 50; rowCount++) {
PdfPCell cell1 = new PdfPCell(new Paragraph("t" + tableCount + " r:" + rowCount));
PdfPCell cell2 = new PdfPCell(new Paragraph("t" + tableCount + " r:" + rowCount));
PdfPCell cell3 = new PdfPCell(new Paragraph("t" + tableCount + " r:" + rowCount));
table.addCell(cell1);
table.addCell(cell2);
table.addCell(cell3);
}
table.setSpacingAfter(10f);
table.setKeepTogether(keepTogether);
document.add(table);
}
document.close();
}
/**
* Utility method that checks the created file against the cmp file
* @param tagged Tagged document
* @param keepTogether PdfPTable.setKeepTogether(true/false)
* @throws DocumentException
* @throws InterruptedException
* @throws IOException
*/
private void compareDocuments(final boolean tagged, final boolean keepTogether) throws DocumentException, InterruptedException, IOException {
String file = "tagged_"+tagged+"-keeptogether_"+keepTogether+".pdf";
CompareTool compareTool = new CompareTool();
String errorMessage = compareTool.compareByContent(outFolder + file, cmpFolder + file, outFolder, "diff");
if (errorMessage != null) {
Assert.fail(errorMessage);
}
}
}